#include "stm32f10x.h"
//#include "Delay.h"
#include "OLED.h"
#include "Xdelay.h"

#include "usart_Debug.h"
#include "stdio.h"
void DHT11_w_data(uint8_t BitVal)
{
	GPIO_WriteBit(GPIOB, GPIO_Pin_12, (BitAction) BitVal);
}
void gpio_init(GPIOMode_TypeDef gpiomode)
{
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=gpiomode;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruct);
}

void DHT11_init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

	DHT11_w_data(1);
	delay_ms(1000);
}

void DHT11_start(void)
{
	gpio_init(GPIO_Mode_Out_OD);
	DHT11_w_data(0);
	delay_ms(18);
	DHT11_w_data(1);
	gpio_init(GPIO_Mode_IPU);
}
void DHT11_stop(void)
{
	uint8_t timeout=0;
	while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==1);
	while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==0)
	{
		timeout++;
		delay_us(1);
	}
	if(timeout>100)
	{
		//OLED_ShowString(4,1,"error");
		return;
	}else
	{
		//OLED_ShowNum(4,1,timeout,4);
	}
		
}
uint8_t DHT11_readack(void)
{
	uint8_t timeout=0;
	while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==1)
	{
		timeout++;
		//OLED_ShowNum(2, 1, GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12), 1);
		delay_us(1);
		if(timeout>50)
		{
			return 0;
		}
	}
	timeout=0;
	//OLED_ShowNum(3, 1, GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12), 1);
	while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==0);
	
	delay_us(87);
	return 1;
}
void DHT11_readdata(u8*mydata)
{
	for(uint8_t i=0;i<5;i++)
	{
		for(uint8_t j=0;j<8;j++)
		{
			//while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==1);
			while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==0);
			delay_us(40);
			mydata[i]<<=1;
			if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==1)
			{
				mydata[i] |=1;
			}
			while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12)==1);
		}
	}
}
void DHT11_Getdata(uint8_t *humility,uint8_t *humilityfloat,uint8_t *temperature,uint8_t *temperaturefloat)
{
	uint8_t data[6]={0};
	uint8_t error;
	DHT11_start();
	error=DHT11_readack();
	if(error==0)
	{
		return ;
	}
	DHT11_readdata(data);
	DHT11_stop();
	if(data[0]+data[1]+data[2]+data[3]!=data[4])
	{
		OLED_ShowString(4,1,"errordata");
		return ;
	}
//	OLED_ShowNum(1,1,data[0],2);
//	OLED_ShowNum(2,1,data[1],2);
//	OLED_ShowNum(3,1,data[2],2);
//	OLED_ShowNum(4,1,data[3],2);
	
	*humility=data[0];
	*humilityfloat=data[1];
	*temperature=data[2];
	*temperaturefloat=data[3];
	printf("DHT11:%d,%d",data[0],data[2]);
}
